#include "Etat.h"

using namespace std;

Etat::Etat():m_etat(0),m_initial(0),m_terminal(0)
{}

Etat::Etat(int etat,bool initial, bool terminal, list<Transition*> transition):m_etat(etat),m_initial(initial),m_terminal(terminal),m_transitions(transition)
{}

Etat::Etat(int etat,bool initial, bool terminal):m_etat(etat),m_initial(initial),m_terminal(terminal)
{}

Etat::~Etat()
{}

int Etat::getEtat()
{
	return m_etat;
}

void Etat::setEtat(int etat)
{
	m_etat = etat;
}

bool Etat::getInitial()
{
	return m_initial;
}

void Etat::setInitial(bool initial)
{
	m_initial = initial;
}

bool Etat::getTerminal()
{
	return m_terminal;
}

void Etat::setTerminal(bool terminal)
{
	m_terminal = terminal;
}

list <Transition*> Etat::getTransitions()
{
	return m_transitions;
}

void Etat::setTransition(list <Transition*> transitions)
{
	m_transitions = transitions;
}

bool Etat::existeTransition(char e)
{
	bool resultat = false;

	for(list <Transition*>::iterator it = m_transitions.begin() ; it != m_transitions.end() ; it++) 
	{
		vector<char> etiquettes = (*it)->getEtiquettes();
		for(int i=0;i<etiquettes.size();i++)
		{
			if (etiquettes[i]==e)
			{
				resultat=true;
			}
		}
	}

	return resultat;
}

list <Etat> Etat::cible(char e)
{
	list <Etat> resultat;

	for(list <Transition*>::iterator it = m_transitions.begin() ; it != m_transitions.end() ; it++) 
	{
		vector<char> etiquettes = (*it)->getEtiquettes();
		for(int i=0;i<etiquettes.size();i++)
		{
			if (etiquettes[i]==e)
			{
				resultat.push_back(*((*it)->getArrivee()));
			}
		}
	}

	return resultat;
}

list <Etat> Etat::cible()
{
	list <Etat> resultat;

	for(list <Transition*>::iterator it = m_transitions.begin() ; it != m_transitions.end() ; it++) 
	{
		resultat.push_back(*((*it)->getArrivee()));	
	}

	return resultat;
}

void Etat::ajouterTransition(vector<char> c, Etat* e)
{
	Etat * temp = this;
	Transition transit(temp,e,c);
	m_transitions.push_back(& transit);
}

vector<char> Etat::listerEtiquettes()
{
	vector<char> resultat;

	//on parcourt toutes les transitions
	for(list <Transition*>::iterator it = m_transitions.begin() ; it != m_transitions.end() ; it++) 
	{
		vector<char> etiquettes = (*it)->getEtiquettes();

		//on parcourt toutes les etiquettes d'une transition
		for(int i=0;i<etiquettes.size();i++)
		{
			bool contient = false;

			//si l'etiquette est deja dans le liste de sortie, on ne doit pas l'ajouter
			for(int j=0;j<resultat.size();j++)
			{
				if (resultat[j]==etiquettes[i])
				{
					contient = true;
				}
			}

			//si l'etiquette n'y est pas, on l'ajoute
			if (!contient)
			{
				resultat.push_back(etiquettes[i]);
			}

			contient = false;
		}
	}

	return resultat;
}